package com.engine;

import com.domain.Award;
import com.domain.Expression;
import com.engine.impl.*;

import java.util.ArrayList;
import java.util.List;

public class RuleEngine {

    //实现规则池
    private static final List<IRule> RULES = new ArrayList<>();
    static {
        //添加规则
        RULES.add(new YiXiu());
        RULES.add(new ErJu());
        RULES.add(new SiJin());
        RULES.add(new SanHong());
        RULES.add(new DuiTang());
        RULES.add(new SiHong());
        RULES.add(new WuZi());
        RULES.add(new WuHong());
        RULES.add(new HeiLiuBo());
        RULES.add(new BianDiJin());
        RULES.add(new HongLiuBo());
        RULES.add(new ChaJinHua());
    }

    /**
     * 判断中将结果的过程
     * @param ex 条件，骰子点数的个数情况
     * @return 结果
     */
    public Award process(Expression ex) {
        //多态，RULES=new 规则
        //rule接收的为规则池中满足条件的规则对象，其他不满足条件的规则被过滤掉
        IRule rule = RULES.stream()
                .filter(r -> r.evaluate(ex))//调用规则类里面的比较方法，判断中将结果
                .findFirst()//取满足的第一个条件
                .orElse(null);//如果都不满足规则池的条件，返回null
        //如果返回的rule接收为null则没有中将
        if (rule == null) {
            return new Award("未中奖", "");
        }

        System.out.println(rule);
        //调用满足规则对象的结果方法并返回
        return rule.getAward();
    }
}
